// 启动服务器
package main

import (
	"admin-api/common/config"
	_ "admin-api/docs"
	"admin-api/pkg/db"
	log2 "admin-api/pkg/log"
	"admin-api/pkg/redis"
	router2 "admin-api/router"
	"context"
	"errors"
	"github.com/gin-gonic/gin"
	"net/http"
	"os"
	"os/signal"
	"time"
)

// swag init
// swagger注释
// @title 通用后台管理系统
// @version 1.0
// @description 后台管理系统API接口文档
// @securityDefinitions.apikey ApiKeyAuth
// @in header
// @name Authorization
func main() {

	//加载日志
	log := log2.Log()
	//设置gin的日志等级
	gin.SetMode(config.Config.Server.Model)
	//路由
	router := router2.InitRouter()
	srv := &http.Server{
		Addr:    ":8080",
		Handler: router,
	}

	//启动服务
	go func() {
		// 监听并启动HTTP服务
		if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
			log.Info("listen: %s \n", err)
		}
		// 打印服务启动成功的日志
		log.Info("listen: %s \n", config.Config.Server.Address)
	}()

	// 创建一个通道用于接收中断信号
	quit := make(chan os.Signal)
	// 监听中断信号
	signal.Notify(quit, os.Interrupt)
	// 阻塞，直到接收到中断信号
	<-quit
	// 打印服务器关闭日志
	log.Info("Shutdown Server ...")
	// 创建一个带有超时的上下文
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	// 优雅关闭服务器
	if err := srv.Shutdown(ctx); err != nil {
		log.Info("Server Shutdown:", err)
	}
	// 打印服务器退出日志
	log.Info("Server exiting")
}

// 初始化数据库
func init() {
	//mysql
	db.SetupMsqDb()
	//redis
	redis.InitRedis()
}
